/** 4.4 静态属性 **/
// class Person {
//   public name: string
//   public age: number = 20
//   // 静态属性
//   static sex = '男'
//   constructor(name: string) {
//     this.name = name
//   }
//   run() { /* 实例方法 */
//     alert(`${this.name}在运动`)
//   }
//   work() {
//     alert(`${this.name}在工作`)
//   }
//   static print() { /**  静态方法 里面没法直接调用类里面的属性 **/
//     alert('print方法' + Person.sex)
//   }
// }
// let p = new Person('张三')
// 4.5 抽象类 继承 多态
/** 多态 **/
// 多态：父类定义一个方法不去实现,让继承它的子类去实现  每一个子类有不同的表现
// 多态属于继承

// class Animal {
//   name: string
//   constructor(name: string) {
//     this.name = name
//   }
//   eat() { // 具体吃什么  不知道， 继承它的子类去实现， 每一个子类的表现不一样
//     console.log('吃的方法')
//   }
// }

// class Dog extends Animal {
//   constructor(name: string) {
//     super(name)
//   }
//   eat() {
//     return this.name + '吃粮食'
//   }
// }

// class Cat extends Animal {
//   constructor(name: string) {
//     super(name)
//   }
//   eat() {
//     return this.name + '吃老鼠'
//   }
// }

// typescript中的抽象类：它是提供其他类继承的基类, 不能直接被实例化
// 用abstract关键字定义抽象类和抽象方法, 抽象类中的抽象方法不包含具体实现并且必须在派生类中实现
// abstract关键字定义抽象类和抽象方法,抽象类中的抽象方法不包含具体实现并且必须在派生类中实现
// abstract抽象方法用来定义标准, 标准: Animal 这个类要求它的子类必须包含eat方法
// abstract class Animal {
//   public name: string
//   constructor(name: string) {
//     this.name = name
//   }
//   abstract eat(): any
// }
// let a = new Animal() /* 错误写法  无法创建抽闲类的实例 */
/* class Dog extends Animal {
  // 抽象类的子类必须实现抽象类里面的抽象方法
  constructor(name: any) {
    super(name)
  }
  eat() {
    console.log(this.name + '吃粮食')
  }
}
let d = new Dog('小花花')
d.eat() */

// class Cat extends Animal {
//   // 抽象类的子类必须实现抽象类里面的抽象方法
//   constructor(name: any) {
//     super(name)
//   }
//   run() {

//   }
//   eat () {
//     console.log(this.name + '吃老鼠')
//   } 
// }
// let c = new Cat('小花猫')
// c.eat()